package primary

fun main() {
    //在数字后面强行加类型可以起到转换作用
    var a = 66L
    println(a)
    //二进制以0b开头，十六进制用0x表示，kotlin没有直接的8进制
    a = 0b11
    println(a)
    a = 0x1c
    println(a)
    //无符号数(只能为大于0的数)
    var b = 1u
    println(b)
    //浮点数，double,float,小数后面加个f就表示float
    val pi = 3.14
    val c = 9.0f
    //double转换为float可能会丢精度
    println(pi)
    //加减乘除操作和java一样
    var d = 3 + 4
    println("3+4=$d")
    d = 3 - 4
    println("3-4=$d")
    d = 3 * 4
    println("3*4=$d")
    d = 3 / 4
    println("3/4=${0}")
    d = 3 % 4
    println("3%4=$d")
    //有+=，++操作。
    d += 4
    println(d)
    d++
    println(d)
    //++a和a++的区别，++在前先自增在得到结果，++在后，先得到结果在进行自增，python中没有++
    var e = 1
    println(e++)
    println(e)
    println(++e)
    //位运算，只适用于int,long类型的数据
    val f = 9//f=9=1001
    val g = 3//g=3=0011
    val h = f and g//h=f and g=0001=1(与运算，同为1结果为1)
    println(h)
    val l = f or g//l= f or g =1011=11(或运算，有1结果为1)
    println(l)
    val m = f xor g//m= f xor g=1010=10(异或运算，相同为0，不同为1)
    println(m)
    //左移，右移
    val n = 1 shl 2//n=1=0001 shl2=0100=4,左移一位相当于×2的结果
    println("n左移2位=$n")
    val o = 8 shr 2//o=8=1000 shr2=0010=2,右移一位相当于/2的结果
    println("o右移两位=$o")
    //无符号右移,不存在无符号右移操作
    // 无符号右移（unsigned shift right）：
// - 不管原数是正是负，高位一律补 0
// - 例如：-1 的二进制（32位）是 11111111 11111111 11111111 11111111
//   执行 ushr 1 后变成：01111111 11111111 11111111 11111111
//   即十进制的 2147483647（Int.MAX_VALUE）
    val p = -1 ushr 1
    println("p无符号右移为$p")
}